home *** CD-ROM | disk | FTP | other *** search
/ ftp.mactech.com 2010 / ftp.mactech.com.tar / ftp.mactech.com / machack / Hacks96 / FinderUndo.sit / Finder Undo / patches.c < prev    next >
Text File  |  1996-06-22  |  4KB  |  246 lines

  1. // patches.c
  2.  
  3. #include <A4Stuff.h>
  4.  
  5. #include "main.h"
  6. #include "patches.h"
  7.  
  8.  
  9. extern InitGrafProc            oldInitGraf;
  10. extern Pack8Proc            oldPack8;
  11. extern MenuSelectProc        oldMenuSelect;
  12. extern MenuKeyProc            oldMenuKey;
  13. extern SpecialHandlerProc    shpChainProc;
  14.  
  15. extern Boolean                igpatched;
  16.  
  17.  
  18. ////////////////////////////////////////////////////////////
  19.  
  20.  
  21. void PatchInitGraf( void )
  22. {
  23.     short trap = _InitGraf; 
  24.     
  25.     oldInitGraf = (InitGrafProc) 
  26.             NGetTrapAddress(trap, (trap & 0x0800) ? ToolTrap : OSTrap);
  27.     NSetTrapAddress((UniversalProcPtr) MyInitGraf,
  28.             trap, (trap & 0x0800) ? ToolTrap : OSTrap);
  29. }
  30.  
  31.  
  32.  
  33.  
  34. pascal void MyInitGraf( void *globalPtr )
  35. {
  36.     InitGrafProc    localIGCopy;
  37.     EnterCodeResource();
  38.     if (igpatched) goto skip;
  39.  
  40.     // make sure we're ok to run
  41.     if ( *(LMGetCurApName())!=(-1) && *(LMGetFinderName())!=(-1) &&
  42.             !EqualString( LMGetFinderName(), LMGetCurApName(), true, true ) )
  43.         goto skip;
  44.     
  45.     // install our ae hooks
  46.     InstallAEHooks();
  47.     
  48.     // install finder patches
  49.     PatchPack8();
  50.     PatchMenuSelect();
  51.     PatchMenuKey();
  52.     InstallBlankNotification();
  53.     
  54.     // and make sure we only do this once
  55.     igpatched = true;
  56.     
  57. skip:
  58.     localIGCopy = oldInitGraf;
  59.     ExitCodeResource();
  60.     (*localIGCopy) ( globalPtr );
  61. }
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75.  
  76. void PatchMenuSelect( void )
  77. {
  78.     short trap = _MenuSelect; 
  79.     
  80.     oldMenuSelect = (MenuSelectProc) 
  81.             NGetTrapAddress(trap, (trap & 0x0800) ? ToolTrap : OSTrap);
  82.     NSetTrapAddress((UniversalProcPtr) MyMenuSelect,
  83.             trap, (trap & 0x0800) ? ToolTrap : OSTrap);
  84. }
  85.  
  86.  
  87.  
  88.  
  89. void PatchMenuKey( void )
  90. {
  91.     short trap = _MenuKey; 
  92.     
  93.     oldMenuKey = (MenuKeyProc) 
  94.             NGetTrapAddress(trap, (trap & 0x0800) ? ToolTrap : OSTrap);
  95.     NSetTrapAddress((UniversalProcPtr) MyMenuKey,
  96.             trap, (trap & 0x0800) ? ToolTrap : OSTrap);
  97. }
  98.  
  99.  
  100.  
  101. void PatchPack8( void )
  102. {
  103.     short trap = _Pack8;
  104.     
  105.     oldPack8 = (Pack8Proc)
  106.             NGetTrapAddress(trap, (trap & 0x0800) ? ToolTrap : OSTrap);
  107.     NSetTrapAddress((UniversalProcPtr) MyPack8,
  108.             trap, (trap & 0x0800) ? ToolTrap : OSTrap);
  109. }
  110.  
  111.  
  112.  
  113.  
  114.  
  115. /*
  116. 4 bytes keyword
  117. 4 bytes shp
  118. 2 bytes isSysHandler
  119. 4 bytes returnaddr
  120. 4 <--- link ptr
  121. */
  122.  
  123. asm pascal short MyPack8(register short selector:__D0,AEKeyword keyword, SpecialHandlerProc shp,Boolean isSysHandler)
  124. {
  125.     long        olda4;
  126.     long        oldd5;
  127.     
  128.     fralloc
  129.     move.l        a4, olda4
  130.     move.l        d5, oldd5
  131.     move.l        d0,d5
  132.     jsr            SetCurrentA4
  133.     move.l        d5,d0
  134.     
  135.     cmpi.w        #0x500,d0    // installspecialhandler
  136.     beq            callspechandlerproc
  137.     cmpi.w        #0x501,d0    // removespecialhandler
  138.     beq            callspechandlerproc
  139.     cmpi.w        #0x52d,d0    // getspecialhandler
  140.     beq            callspechandlerproc
  141.     
  142.     cmpi.w        #0xd17,d0    // aesend
  143.     beq            callaesendproc
  144.  
  145.     bra.s        callthru
  146.  
  147. callaesendproc:
  148.     move.l        d5,d0
  149.     move.l        8(a6),-(sp)        // filterproc
  150.     move.l        12(a6),-(sp)    // idleproc
  151.     move.l        16(a6),-(sp)    // timeout
  152.     move.w        20(a6),-(sp)    // send priority
  153.     move.l        22(a6),-(sp)    // send mode
  154.     move.l        26(a6),-(sp)    // reply
  155.     move.l        30(a6),-(sp)    // theevent
  156.     
  157.     jsr            MyAESend
  158.     lea            26(sp),sp
  159.     bra.s        callthru
  160.     
  161. callspechandlerproc:
  162.     move.l        d5,d0
  163.     MOVE.W        8(A6),-(SP)
  164.     MOVE.L        10(A6),-(SP)
  165.     MOVE.L        14(A6),-(SP)
  166.     
  167.     jsr            MyPack8Helper
  168.     LEA            10(SP),SP
  169.     tst.w        d0
  170.     bne            callthru
  171.  
  172. nevermind:
  173.     MOVEQ        #0,D0
  174.     
  175.     move.l        olda4, a4
  176.     move.l        oldd5, d5
  177.     frfree
  178.     
  179.     MOVE.L        (SP)+,A0
  180.     LEA            10(SP),SP
  181.     JMP            (A0)
  182.     
  183. callthru:
  184.     move.l        oldPack8,a0
  185.     move.l        d5, d0
  186.     move.l        olda4, a4
  187.     move.l        oldd5, d5
  188.     frfree
  189.     jmp            (a0)
  190.     
  191. }
  192.  
  193.  
  194.  
  195. short MyPack8Helper( AEKeyword keyword, SpecialHandlerProc shp, Boolean isSysHandler,
  196.     short selector:__D0 ):__D0
  197. {
  198.     Boolean        suppress = false;
  199.     EnterCodeResource();
  200.     
  201.     switch(selector)
  202.     {
  203.         case 0x500:    // install
  204.             if ( (keyword == keyPreDispatch) && !isSysHandler)
  205.             {
  206.                 DebugStr( "\psomeone's installing a phac handler...." );
  207.                 shpChainProc = shp;
  208.                 suppress = true;
  209.             }
  210.             break;
  211.             
  212.         case 0x501:    // remove
  213.             if ( (keyword == keyPreDispatch) && !isSysHandler)
  214.             {
  215.                 DebugStr( "\psomeone's removing a phac handler...." );
  216.                 if ( shp == shpChainProc)
  217.                     shpChainProc = nil;
  218.                 suppress = true;
  219.             }
  220.             break;
  221.             
  222.         case 0x52d:    // get
  223.             if ( (keyword == keyPreDispatch) && !isSysHandler)
  224.             {
  225.                 DebugStr( "\psomeone's getting the phac handler...." );
  226.                 *((SpecialHandlerProc*)shp) = shpChainProc;
  227.                 suppress = true;
  228.             }
  229.             break;
  230.     }
  231.     
  232.     ExitCodeResource();
  233.     
  234.     if (suppress) return 0;
  235.     else          return selector;
  236. }
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.